package bitetorrentserver;

import java.util.ArrayList;

/**
 *
 * @author user
 */
public class PeerFileList {

    ArrayList<PeerFile> peerFiles;
    Files listFiles;

    public PeerFileList() {
        // Read listFiles
        listFiles = new Files(null);
        System.out.println("List Files : \n " + listFiles);

        peerFiles = new ArrayList<PeerFile>();
    }

    public void add(PeerFile peer) {
        peerFiles.add(peer);
    }

    public PeerFile getPeer(String info_has, String address) {
        PeerFile peerFile = null;
        for (int i = 0; i < peerFiles.size(); ++i) {
            peerFile = peerFiles.get(i);

            if (peerFile.info_hash.equals(info_has) && peerFile.address.equals(address)) {
                // Found
                return peerFile;
            }
        }

        return peerFile;
    }

    public PeerFile delete(String info_has, String address) {
        PeerFile peer;
        for (int i = 0; i < peerFiles.size(); ++i) {
            peer = peerFiles.get(i);

            if (peer.info_hash.equals(info_has) && peer.address.equals(address)) {
                // Remove
                return peerFiles.remove(i);
            }
        }

        return null;
    }

    public int complete(String info_has, String peer_address) {
        int complete = 0;
        PeerFile peer;

        // Lihat di list peer_file
        for (int i = 0; i < peerFiles.size(); ++i) {
            peer = peerFiles.get(i);

            if (peer.info_hash.equals(info_has) && peer.left == 0 && !peer.address.equals(peer_address)) {
                // Incremeent
                ++complete;
            }
        }

        // Lihat di list file
        File file;
        for (int i = 0; i < listFiles.files.size(); ++i) {
            file = listFiles.files.get(i);
            if (info_has.equals(file.filename)) {
                ArrayList<PeerFile> peer_files = getPeersByAddress(file.address);
                complete += peer_files.size();
            }
        }

        return complete;
    }

    public int incomplete(String info_has, String peer_address) {
        int incomplete = 0;
        PeerFile peer;
        for (int i = 0; i < peerFiles.size(); ++i) {
            peer = peerFiles.get(i);

            if (peer.info_hash.equals(info_has) && peer.left != 0 && !peer.address.equals(peer_address)) {
                // Incremeent
                ++incomplete;
            }
        }

        return incomplete;
    }

    public ArrayList<PeerFile> getPeersByAddress(String address) {
        ArrayList<PeerFile> result = new ArrayList<PeerFile>();
        PeerFile peer;

        for (int i = 0; i < peerFiles.size(); ++i) {
            peer = peerFiles.get(i);

            if (peer.address.equals(address)) {
                result.add(peer);
            }
        }

        return result;
    }

    public String getPeersByInfoHash(String info_hash, String peer_address) {
        String str = "";

        PeerFile peer;
        // Complete PeerFile form peerfiles
        for (int i = 0; i < peerFiles.size(); ++i) {
            peer = peerFiles.get(i);

            if (peer.info_hash.equals(info_hash) && peer.left == 0 && !peer.address.equals(peer_address)) {
                str += peer.address + ":" + peer.port + " ";
            }
        }

        // Complete PeerFile form listfiles
        File file;
        for (int i = 0; i < listFiles.files.size(); ++i) {
            file = listFiles.files.get(i);
            if (info_hash.equals(file.filename)) {
                ArrayList<PeerFile> peer_files = getPeersByAddress(file.address);

                for (int j = 0; j < peer_files.size(); ++j) {
                    peer = peer_files.get(j);
                    str += peer.address + ":" + peer.port + " ";
                }
            }
        }

        // Incomplete PeerFile
        for (int i = 0; i < peerFiles.size(); ++i) {
            peer = peerFiles.get(i);

            if (peer.info_hash.equals(info_hash) && peer.left != 0 && !peer.address.equals(peer_address)) {
                str += peer.address + ":" + peer.port + " ";
            }
        }

        return str;
    }

    public void evaluateTimeoutPeer() {
        PeerFile peerFile;
        // Complete PeerFile form listpeer_files
        for (int i = 0; i < peerFiles.size(); ++i) {
            peerFile = peerFiles.get(i);
            if(peerFile.timeout < System.currentTimeMillis())
            {
                peerFiles.remove(i);
                --i;
            }
        }
    }
}
